import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
import matplotlib as mpl

# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'WenQuanYi Micro Hei']
plt.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.size'] = 12  # 设置全局字体大小

def main():
    if not os.path.exists("images"):
        os.makedirs("images")
    # 读取数据
    df = pd.read_csv("csv/expert_data.csv")

    # 1. 基本属性分布可视化
    plt.figure(figsize=(15, 10))

    # 彩龄分布
    plt.subplot(2, 2, 1)
    ax1 = sns.histplot(df['彩龄'], bins=20, kde=False, color='#748ffc')
    plt.title('彩龄分布', fontsize=14)
    plt.xlabel('彩龄（年）', fontsize=12)
    plt.ylabel('专家数量', fontsize=12)

    for p in ax1.patches:
        height = p.get_height()
        if height > 0:
            ax1.text(p.get_x() + p.get_width()/2., height + 0.2,
                    f'{int(height)}',
                    ha='center', va='bottom', fontsize=9)

    # 粉丝数分布
    plt.subplot(2, 2, 2)
    ax2 = sns.histplot(df['粉丝数'], bins=20, kde=False, color='#4c6ef5')
    plt.title('粉丝数分布', fontsize=14)
    plt.xlabel('粉丝数', fontsize=12)
    plt.ylabel('专家数量', fontsize=12)

    for p in ax2.patches:
        height = p.get_height()
        if height > 0:
            ax2.text(p.get_x() + p.get_width()/2., height + 0.2,
                    f'{int(height)}',
                    ha='center', va='bottom', fontsize=9)

    # 发文量分布
    plt.subplot(2, 2, 3)
    ax3 = sns.histplot(df['文章数'], bins=20, kde=False, color='#cc5de8')
    plt.title('发文量分布', fontsize=14)
    plt.xlabel('文章数量', fontsize=12)
    plt.ylabel('专家数量', fontsize=12)

    for p in ax3.patches:
        height = p.get_height()
        if height > 0:
            ax3.text(p.get_x() + p.get_width()/2., height + 0.2,
                    f'{int(height)}',
                    ha='center', va='bottom', fontsize=9)

    # 职位分布
    plt.subplot(2, 2, 4)
    position_counts = df['职位'].value_counts()
    explode = [0.1 * (i == 0) for i in range(len(position_counts))]
    colors = plt.cm.Pastel1(np.linspace(0, 1, len(position_counts)))

    wedges, texts, autotexts = plt.pie(
        position_counts,
        explode=explode,
        autopct=lambda p: f'{p:.1f}%\n({int(p / 100 * position_counts.sum())})',
        startangle=90,
        colors=colors,
        wedgeprops={'linewidth': 1.5, 'edgecolor': 'w', 'width': 0.6},
        textprops={'fontsize': 9, 'fontweight': 'bold'}
    )

    plt.text(0, 0, f'总人数:\n{position_counts.sum()}',
             ha='center', va='center', fontsize=12, fontweight='bold')
    plt.title(f'职位分布 (n={position_counts.sum()})', fontsize=14, pad=15)
    plt.axis('equal')

    plt.legend(
        wedges,
        [f'{label}: {count}人' for label, count in position_counts.items()],
        title="职位类型",
        loc="center left",
        bbox_to_anchor=(1, 0.5),
        frameon=False
    )

    plt.tight_layout()
    plt.savefig('images/基本属性分布_带数值.png', dpi=300, bbox_inches='tight')
    plt.show()

    # 2. 中奖情况分析
    plt.figure(figsize=(10, 8))
    awards = df[['一等奖', '二等奖', '三等奖']].sum()

    # 设置分离效果
    explode_awards = (0.1, 0.05, 0)
    colors = ['#FF6B6B', '#4ECDC4', '#556270']

    wedges, texts, autotexts = plt.pie(
        awards,
        explode=explode_awards,
        labels=awards.index,
        autopct=lambda p: f'{p:.1f}%\n({int(p/100*awards.sum())})',
        colors=colors,
        startangle=90,
        shadow=True,
        wedgeprops={'linewidth': 2, 'edgecolor': 'w'},
        textprops={'fontsize': 11, 'color': 'white', 'fontweight': 'bold'}
    )

    # 添加标题和注释
    plt.title(f'奖项分布 (总中奖次数: {awards.sum()})', fontsize=16, pad=20)
    plt.text(-1.2, -1.2, f"一等奖人数: {df['一等奖'].sum()}\n二等奖人数: {df['二等奖'].sum()}\n三等奖人数: {df['三等奖'].sum()}",
             fontsize=12, bbox=dict(facecolor='white', alpha=0.8))

    plt.axis('equal')
    plt.tight_layout()
    plt.savefig('images/奖项分布.png', dpi=300, bbox_inches='tight')
    plt.show()

    # 3. 属性间相关性分析
    plt.figure(figsize=(12, 9))
    corr_matrix = df[['彩龄', '粉丝数', '文章数', '一等奖', '二等奖', '三等奖']].corr()
    mask = np.triu(np.ones_like(corr_matrix, dtype=bool))

    sns.heatmap(
        corr_matrix,
        mask=mask,
        annot=True,
        cmap='vlag',
        fmt=".2f",
        linewidths=.5,
        annot_kws={"size": 10, "weight": "bold"},
        cbar_kws={"shrink": 0.8}
    )

    plt.title('属性相关性分析热力图', fontsize=14, pad=20)
    plt.xticks(rotation=45, ha='right', fontsize=10)
    plt.yticks(fontsize=10)
    plt.tight_layout()
    plt.savefig('images/correlation_heatmap.png', dpi=300, bbox_inches='tight')
    plt.show()

    # 4. 中奖率影响因素分析
    df['总中奖'] = df['一等奖'] + df['二等奖'] + df['三等奖']
    df['中奖率'] = df['总中奖'] / df['文章数'].replace(0, 1)

    plt.figure(figsize=(12, 8))

    # 彩龄与中奖率关系
    plt.subplot(2, 2, 1)
    sns.regplot(x='彩龄', y='中奖率', data=df, scatter_kws={'alpha':0.5})
    plt.title('彩龄对中奖率的影响')

    # 粉丝数与中奖率关系
    plt.subplot(2, 2, 2)
    sns.regplot(x='粉丝数', y='中奖率', data=df, scatter_kws={'alpha':0.5})
    plt.title('粉丝数对中奖率的影响')

    # 发文量与中奖率关系
    plt.subplot(2, 2, 3)
    sns.regplot(x='文章数', y='中奖率', data=df, scatter_kws={'alpha':0.5})
    plt.title('发文量对中奖率的影响')

    plt.tight_layout()
    plt.savefig('images/中奖率影响因素.png', dpi=300, bbox_inches='tight')
    plt.show()

if __name__ == "__main__":
    main()